<?php

/**
 * 管理员接口
 */

declare(strict_types=1);

namespace service\service;

use service\exception\ServiceException;
use service\ext\PageData;
use service\vo\admin\Admin;

interface AdminService
{

    /**
     * 异常提示信息
     */
    const ERROR_ADMIN_EXISTS = 'ERROR_ADMIN_EXISTS';  //管理员已存在
    const ERROR_ADMIN_NOT_EXISTS = 'ERROR_ADMIN_NOT_EXISTS';  //管理员不存在
    const ERROR_ADMIN_DELETE_SUPER = 'ERROR_ADMIN_DELETE_SUPER';  //超级管理员不可删除
    const ERROR_ADMIN_LOGIN_ERROR = 'ERROR_ADMIN_LOGIN_ERROR';  //管理员用户名或密码错误
    const ERROR_ADMIN_LOGIN_STATUS = 'ERROR_ADMIN_LOGIN_STATUS';  //管理员不可用
    const ERROR_ADMIN_HAS_SUBJECT = 'ERROR_ADMIN_HAS_SUBJECT';  //管理员发布过题目不可删除

    /**
     * 添加管理员
     *
     * @param Admin $admin 管理员对象
     *
     * @return int 新添加的id
     *
     * @throws ServiceException
     *    ERROR_ADMIN_EXISTS
     */
    public function addAdmin(Admin $admin): int;

    /**
     * 编辑管理员
     * @param Admin $admin
     * @return int 影响的行数
     */
    public function editAdmin(Admin $admin): int;

    /**
     * 删除管理员
     * @param int $id 管理员id
     * @return int 影响的行数
     *
     * @throws ServiceException
     *    ERROR_ADMIN_DELETE_SUPER
     *    ERROR_ADMIN_HAS_SUBJECT
     */
    public function deleteAdmin(int $id): int;

    /**
     * 根据Id获取管理员详情
     * @param int $id 管理员id
     * @return Admin 对象
     *
     * @throws
     *    ERROR_ADMIN_NOT_EXISTS
     */
    public function getAdminById(int $id): Admin;

    /**
     * 根据Ids获取管理员列表
     *
     * @param array $ids
     * @return array
     */

    public function getAdminsByIds(array $ids): array;

    /**
     * 登录
     * @param string $username 用户名
     * @param string $password 密码
     * @return Admin  管理员对象
     *
     * @throws ServiceException
     *    ERROR_ADMIN_LOGIN_ERROR
     *    ERROR_ADMIN_LOGIN_STATUS
     */
    public function login(string $username, string $password): Admin;

    /**
     * 搜索管理员
     * @param int $currentPage 当前页
     * @param int $pageSize 每页显示数量
     * @param array $filterCriteria //搜索条件数组，其中的value是搜索值，其中的key从下面字符串中取
     *        'Name'            =>    用户名，模糊查询
     *        'status'        =>    状态
     *        'AddTime'        =>    时间，array('start'=>'开始时间','end'=>'结束时间')
     * @param array $sorterCriteria //排序条件，其中的value是搜索值，其中的key从下面字符串中取
     *        'ID'    =>    true为升序false为降序
     *
     * @return PageData
     */
    public function searchAdmin(int $currentPage, int $pageSize, array $filterCriteria, array $sorterCriteria): PageData;
}
